package com.js.common.service;

import com.js.common.response.TableResultResponse;
import com.js.common.util.Query;

import java.util.List;

/**
 * @author： ygl
 * @date： 2018/10/25
 * @Description：
 * 基础接口
 */
public interface BaseService<T> {

    /**
     * 新增数据
     * @param t 实体
     * @return 插入数据的个数
     */
    int insertSelective(T t);

    /**
     * 批量插入数据
     * @param list 实体集合
     * @return 插入数据的个数
     */
    int insertList(List<T> list);

    /**
     * 物理删除实体
     * @param t 实体
     * @return 删除数据的个数
     */
    int delete(T t);

    /**
     * 通过主键ID删除实体
     * @param id 主键
     * @return 删除数据的个数
     */
    int deleteById(Object id);

    /**
     * update deleted = 1 by ID
     * @param id id
     * @return
     */
    int deleteLogicById(Object id);

    /**
     * 根据主键更新实体全部字段，null值会被更新
     * @param t 实体
     * @return 更新数据的个数
     */
    int updateById(T t);

    /**
     * 根据主键更新属性不为null的值
     * @param t 实体
     * @return 更新数据的个数
     */
    int updateSelectiveById(T t);

    /**
     * 批量修改数据
     * 根据主键更新实体全部字段，null值会被更新
     * @param list 实体列表
     * @return 批量更新数据的个数
     */
    int updateList(List<T> list);

    /**
     * 批量修改数据
     * 根据主键更新属性不为null的值
     * @param list 实体列表
     * @return 批量更新数据的个数
     */
    int updateSelectiveList(List<T> list);

    /**
     * 查询所有的实体数据
     * @return
     */
    List<T> selectAll();

    /**
     * 通过条件查询所有满足的实体
     * @param entity
     * @return
     */
    List<T> selectList(T entity);
    /**
     * 根据主键查询实体
     * @param id  主键
     * @return 实体
     */
    T selectById(Object id);

    /**
     * 根据多个主键查询实体列表
     * @param ids 主键,如 "1,2,3,4"
     * @return 实体列表
     */
    List<T> selectByIds(String ids);

    /**
     * 根据主键集合查询实体列表
     * @param ids 主键集合
     * @return 实体列表
     */
    List<T> selectByIdList(List<String> ids);

    /**
     * 根据主键数组查询实体列表
     * @param ids 主键数组
     * @return 实体列表
     */
    List<T> selectByIdArray(String[] ids);

    /**
     * 根据自定义条件查询
     * @param example
     * @return
     */
    List<T> selectByExample(Object example);

    /**
     * 分页查询
     * @param query
     * @return
     */
    TableResultResponse<T> selectByQuery(Query query);
}
